package com.faiz.example.springtest.plugin;

import com.faiz.example.springtest.Utils.SnowWorker;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;

import java.sql.PreparedStatement;
import java.util.Properties;

@Intercepts({@Signature(
        type = ParameterHandler.class,
        method = "setParameters",
        args = {PreparedStatement.class}
)})
public class InsertPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //目标对象
        Object target = invocation.getTarget();
        //获取目标对象中所有属性的值，因为ParameterHandler使用的是DefaultParameterHandler，因此里面的所有的属性都封装在其中
        MetaObject metaObject = SystemMetaObject.forObject(target);
        //使用xxx.xxx.xx的方式可以层层获取属性值，这里获取的是mappedStatement中的id值
        String value = (String) metaObject.getValue("mappedStatement.id");
        //如果是指定的查询方法
        if ("com.faiz.example.springtest.dao.mapper.StudentMapper.insert".equals(value)){
        //设置参数的值是admin_1，即是设置id=admin_1，因为这里只有一个参数，可以这么设置，如果有多个需要需要循环
            String id = SnowWorker.generateId();
            System.out.println("========================");
            System.out.println("id:"+id);
            System.out.println("========================");
            metaObject.setValue("parameterObject.id", id);
        }
        //执行目标方法
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        //如果没有特殊定制，直接使用Plugin这个工具类返回一个代理对象即可
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }
}
